package com.ntd.study.base.type.arrays;

import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * set 集合相关内容 - 不可重复、允许一个null元素
 */
public class SetDemo {
    /**
     * Set
     * 1.确定性
     * 2.互异性-不会存储重复的元素（依据hashCode和equals返回结果判断重复-主要依据equals）
     * 3.无序性
     */
    Set set;

    /**
     * SortedSet
     * set用比较接口 继承set
     */
    SortedSet sortedSet;

    /**
     * set 的抽象类
     * 继承 AbstractCollection
     * 实现 set 接口
     */
    AbstractSet abstractSet;

    /**
     * hashSet
     * 继承 AbstractSet
     * 实现 Set<E>, Cloneable, Serializable 接口
     * 内部实现使用的是 HashMap，数据存储在HashMap的Key中，value都是同一个默认值
     * 哈希表键存放的是哈希值。HashSet存储元素的顺序并不是按照存入时的顺序（和List显然不同） 是按照哈希值来存的所以取数据也是按照哈希值取得。
     */
    HashSet hashSet;

    /**
     * linkedHashSet
     * 继承 HashSet
     * 与hashSet区别是内部使用的是LinkHashSet
     * 与其余set区别是有序的-遍历和插入顺序是一致的
     */
    LinkedHashSet linkedHashSet;

    /**
     * treeSet
     * 继承 AbstractSet
     * 实现 NavigableSet<E>, Cloneable, Serializable
     * 内部实现采用红黑树（二叉树的特殊情况，左子节点小于右子节点，相等不会进行插入-set的唯一性判定规则）
     * 1.有序（排序方式：1.自然排序，2.Comparator比较器排序）
     * 2.基于treeMap实现
     * 3.非同步（它的迭代器返回的是fail-fast的）
     */
    TreeSet treeSet;

    /**
     * 线程安全的 set
     * 内部使用结构 CopyOnWriteArrayList
     */
    CopyOnWriteArraySet copyOnWriteArraySet;
}
